#pragma once
#include<iostream>
#include<string>
#include<cerrno>
#include<cstring>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<cstdlib>
//由于linux要使用很多系统调用的C语言的函数，所以注定了c++编程一定是c/c++混编的方式

//不同进程之间通信的前提：先让不同的进程看到同一份资源

//开始学习命名管道：
//匿名管道只能在有血缘关系的进程之间的通信，我们平时的>重定向符号是一种在任何进程之间的通信方式，所以要学习现在的命名管道
//命名管道也是一种内存级文件，并不会刷盘

//命名管道要让两个进程打开同一份文件，如何保证打开的一定是同一份文件呢？就是：路径+文件名 同一个路径下的同名文件就是同一个文件

//命名管道是有协同互斥功能的，也满足管道使用的四种情况，例如：当写端没有写入内容的时候，读端阻塞 。读端关闭后，写端会被信号杀死

//补充：写入到管道中的数据在被读取后会从管道中移除

#define FIFO_FILE "./myfifo"//定义好路径和文件名作为管道文件
#define MODE 0666//权限模式
enum
{
    FIFO_CREATE_ERR=1,//第一个是1，后面的枚举类型就是递增的数字
    FIFO_DELETE_ERR,
    FIFO_OPEN_ERR
};

class Init
{
public:
    Init()
    {
        //创建命名管道
        int n=mkfifo(FIFO_FILE,MODE);//在指定的字符串类型的路径中创建权限为MODE的管道
        if(n==-1)
        {
            perror("mkfifo");
            exit(FIFO_CREATE_ERR);
        }

    }
    ~Init()//管道的析构
    {
        //虽然系统会在进程结束时自动清理未关闭的 FIFO 文件，但显式删除是更好的实践。
        int m=unlink(FIFO_FILE);//使用unlink可以手动删除命名管道,指定管道的路径即可
        if(m==-1)
        {
            perror("unlink");
            exit(FIFO_DELETE_ERR);
        }
    }

};